home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / SNIP0492.ARJ / FOSSIL.C < prev    next >
C/C++ Source or Header  |  1991-09-23  |  3KB  |  161 lines

  1. /*
  2. **  fossil.c -- preliminary C versions of fossil interface functions
  3. */
  4.  
  5. #include <dos.h>
  6. #include "fossil.h"
  7.  
  8. unsigned char fossilMaxFunc = 0;
  9. unsigned char fossilRevision = 0;
  10.  
  11.  
  12. /*
  13. **   port_open, port_close -- open and close a port for access
  14. **
  15. **   returns non-zero on error
  16. **
  17. **   As with all these functions, the "port" argument indexes the fossil's
  18. **   port sequence, which need not be the same as the DOS order, that is,
  19. **   port 0 need not be COM1.
  20. **
  21. **   Side Effects:
  22. **
  23. **   port_open asserts DTR if the open succeeds
  24. **       the globals fossilMaxFunc and fossilRevision are initialized
  25. **
  26. **   port_close does NOT affect DTR
  27. **
  28. **   Oddities:
  29. **
  30. **   If port == 0xff, the fossil may perform setup/wrapup to make the keyboard
  31. **   and display functions usable.  The fossil calls that access these devices
  32. **   are not currently supported in this interface library.
  33. */
  34.  
  35. int pascal port_open(int port)
  36. {
  37.       union REGS r;
  38.  
  39.       r.h.ah = 4;
  40.       r.x.dx = port;
  41.       r.x.bx = 0;         /* must not be 0x4f50! */
  42.       int86(0x14, &r, &r);
  43.       if (r.x.ax == 0x1954)
  44.       {
  45.             fossilMaxFunc = r.h.bl;
  46.             fossilRevision = r.h.bh;
  47.             return 0;
  48.       }
  49.       return -1;
  50. }
  51.  
  52. int pascal port_close(int port)
  53. {
  54.       union REGS r;
  55.  
  56.       r.h.ah = 5;
  57.       r.x.dx = port;
  58.       int86(0x14, &r, &r);
  59.       return 0;
  60. }
  61.  
  62. /*
  63. **  port_setBaud -- set serial port's speed and other parameters
  64. */
  65.  
  66. void pascal port_setBaud(int port, int baud)
  67. {
  68.       union REGS r;
  69.  
  70.       r.h.ah = 0;
  71.       r.h.al = baud;
  72.       r.x.dx = port;
  73.       int86(0x14, &r, &r);
  74. }
  75.  
  76. /*
  77. **   port_flow -- set flow-control mode
  78. **
  79. **   returns (nothing?)
  80. **
  81. **   "mode" should be one of the symbols defined in the header
  82. */
  83.  
  84. void pascal port_flow(int port, int mode)
  85. {
  86.       union REGS r;
  87.  
  88.       r.h.ah = 15;
  89.       r.x.dx = port;
  90.       r.h.al = mode;
  91.       int86(0x14, &r, &r);
  92. }
  93.  
  94. /*
  95. **   port_dtr -- control DTR line
  96. **
  97. **   Asserts (enable != 0) or deserts (enable == 0) the port's DTR line
  98. */
  99.  
  100. void pascal port_dtr(int port, int enable)
  101. {
  102.       union REGS r;
  103.  
  104.       r.h.ah = 6;
  105.       r.h.al = enable ? 1 : 0;
  106.       r.x.dx = port;
  107.       int86(0x14, &r, &r);
  108. }
  109.  
  110. /*
  111. **   port_status -- get port's status
  112. **
  113. **   returns a bit-mapped status (see PS_... symbols in header)
  114. */
  115.  
  116. int pascal port_status(int port)
  117. {
  118.       union REGS r;
  119.  
  120.       r.h.ah = 3;
  121.       r.x.dx = port;
  122.       int86(0x14, &r, &r);
  123.       return r.x.ax;
  124. }
  125.  
  126. /*
  127. **   port_read, port_write -- non-blocking multi-character data transfer
  128. **
  129. **   returns the number of characters actually transferred
  130. */
  131.  
  132. int pascal port_read(int port, char *buf, int n)
  133. {
  134.       union REGS r;
  135.       struct SREGS s;
  136.  
  137.       r.h.ah = 24;
  138.       r.x.dx = port;
  139.       r.x.di = (int)buf;  /* near model assumed here */
  140.       r.x.cx = n;
  141.       segread(&s);
  142.       s.es = s.ds;        /* and here */
  143.       int86x(0x14, &r, &r, &s);
  144.       return r.x.ax;
  145. }
  146.  
  147. int pascal port_write(int port, const char *buf, int n)
  148. {
  149.       union REGS r;
  150.       struct SREGS s;
  151.  
  152.       r.h.ah = 25;
  153.       r.x.dx = port;
  154.       r.x.di = (int)buf;  /* near model assumed here */
  155.       r.x.cx = n;
  156.       segread(&s);
  157.       s.es = s.ds;        /* and here */
  158.       int86x(0x14, &r, &r, &s);
  159.       return r.x.ax;
  160. }
  161.